
#pragma region CLASS_DESCRIPTION
/*
* =========================================================================================

* AUTHOR:      Physics Core Team (Ron Ram, Matt Hoyes, Randy Prieto, Kris Greene)
* DATE:        01/17/2012
*
* CLASS:       Base Class for all 3D Shapes (Shape3D.h)
*
* DESCRIPTION:
* ---------------------------------------------------------------------------------------
*	All 3D shapes must inherit & implement all properties and behaviours described in 
*	Shape3D abstract class
* =========================================================================================
*/
#pragma endregion


#ifndef SHAPE3D_H_
#define SHAPE3D_H_


#pragma region INCLUDEs
//
#include "ICollision3D.h"
#include "Vector3.h"

#pragma endregion 



namespace Physics
{
	//NOTE: Use virtual inheritance to avoid problems with multiple inheritance...
	class Shape3D: virtual public ICollision3D
	{
	protected:
		//DATA MEMBERS...
		Vector3 position, direction;
		float speed, mass;

	public:
		//---------------- CONSTRUCTORS ----------------
		Shape3D();																										//C001: Default Constructor
		Shape3D(const Vector3 &pos);																					//C002: Overloaded Constructor
		Shape3D(const Vector3 &pos, const Vector3 &dir);																//C003: Overloaded Constructor
		Shape3D(const Vector3 &pos, const Vector3 &dir, const float speed, const float mass);							//C004: Overloaded Constructor
		Shape3D(const float X, const float Y , const float Z, const float dir, const float speed, const float mass);	//C005: Overloaded Constructor

		virtual ~Shape3D() { }																							//C006: EMPTY Virtual Destructor, in case this class is inherited later

		//---------------- PROPERTIES ----------------		
		virtual const Vector3 getPosition() const;											//M001: Getter Position
		virtual void setPosition(const float X, const float Y , const float Z);				//M002: Setter Position
		virtual void setPosition(const Vector3 &value);										//M003: Setter Position

		virtual const Vector3 getDirection() const;											//M004: Setter Direction
		virtual void setDirection(const float X, const float Y , const float Z);			//M005: Getter Direction
		virtual void setDirection(const Vector3 &value);									//M006: Getter Direction

		virtual const float getSpeed() const;												//M007: Getter Speed
		virtual void setSpeed(const float s);												//M008: Setter Speed

		virtual const float getMass() const;												//M009: Getter Mass
		virtual void setMass(const float m);												//M010: Setter Mass

		//NOTE: Center should be calculated on the fly, 
		//based off Position in Concrete classes!!!
		virtual const Vector3 getCenter() const = 0;										//M011: Getter Center


		//---------------- METHODs ----------------
#pragma region ROTATION_3D
		//Applied to XYZ Directions
		virtual void rotateInDegs(const Vector3 &degrees) = 0;								//M012: Rotation input Vector3 in DEGREES
		virtual void rotateInDegs(const float degrees) = 0;									//M013: Rotation input float in DEGREES
		virtual void rotateInDegs(const float X, const float Y, const float Z) = 0;			//M014: Rotation input floats in DEGREES

		//Applied to XYZ Directions
		virtual void rotateInRads(const Vector3 &radians) = 0;								//M015: Rotation input Vector3 in RADIANS
		virtual void rotateInRads(const float radians) = 0;									//M016: Rotation input float in RADIANS
		virtual void rotateInRads(const float X, const float Y, const float Z) = 0;			//M017: Rotation input floats in RADIANS

		//Applied to X-Direction
		virtual void rotateX_InDegs(const float degrees) = 0;								//M018: Rotation input float in DEGREES
		virtual void rotateX_InRads(const float radians) = 0;								//M019: Rotation input float in RADIANS

		//Applied to Y-Direction
		virtual void rotateY_InDegs(const float degrees) = 0;								//M020: Rotation input float in DEGREES
		virtual void rotateY_InRads(const float radians) = 0;								//M021: Rotation input float in RADIANS

		//Applied to Z-Direction
		virtual void rotateZ_InDegs(const float degrees) = 0;								//M022: Rotation input float in DEGREES
		virtual void rotateZ_InRads(const float radians) = 0;								//M023: Rotation input float in RADIANS
#pragma endregion


#pragma region TRANSLATE_POSITION
		//Translate XYZ Positions
		virtual void translatePosition(const float X, const float Y, const float Z) = 0;	//M024: Translate Position using float
		virtual void translatePosition(const Vector3 &value) = 0;							//M025: Translate Position using Vector3
#pragma endregion


#pragma region TRANSLATE_DIRECTION
		//Translate XYZ Directions
		virtual void translateDirection(const float X, const float Y, const float Z) = 0;	//M026: Translate Direction using floats
		virtual void translateDirection(const Vector3 &value) = 0;							//M027: Translate Direction using Vector3
#pragma endregion

	};
} /* NAMESPACE */

#endif